#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <windows.h>
#include <GL/glut.h>
#include <math.h>
#endif

#include "CurvaBSpline.h"
#include "Ponto.h"
#include "Auxiliar.h"
CurvaBSpline::CurvaBSpline(int grau)
{
    m_Grau = grau;
    //ctor
}

CurvaBSpline::~CurvaBSpline()
{
    //dtor
}
Ponto* CurvaBSpline::avalia(float u, int indInicio, int indFinal)
{
    int i;
    float somatorioX = 0;
    float somatorioY = 0;
    for(i = indInicio; i <= indFinal; i++) {
        somatorioX += (m_Pontos[i]->GetPosX())*(Auxiliar::combinacao(m_Grau,i))*pow(u,i)*pow((1-u),(m_Grau-i));
        somatorioY += (m_Pontos[i]->GetPosY())*(Auxiliar::combinacao(m_Grau,i))*pow(u,i)*pow((1-u),(m_Grau-i));
    }
    return new Ponto(somatorioX, somatorioY);
    //return new Ponto(0, 0);
}

void CurvaBSpline::desenharCurva()
{
    glColor3d(1,0,0);
    float u;
    int indInicio,indFinal,i;
    Ponto* pontoAnterior;
    Ponto* pontoAtual;

    for (indInicio = 0; indInicio <= m_Grau-3; indInicio++)
    {
        indFinal = indInicio+3;
        pontoAnterior = avalia(0, indInicio, indFinal);
        for (i = 1; i <= 30; i++)
        {
            u = i/30.0f;
            pontoAtual = avalia(u, indInicio, indFinal);
            glBegin(GL_LINES);
                glVertex2f(pontoAnterior->GetPosX(), pontoAnterior->GetPosY());
                glVertex2f(pontoAtual->GetPosX(), pontoAtual->GetPosY());
            glEnd();
            pontoAnterior = pontoAtual;
        }
    }



}

void CurvaBSpline::adPonto(float x, float y) {
    Ponto* p;
    p = new Ponto(x,y);
    m_Pontos.push_back(p);
}
